/*
 * @Author: zhang
 * @Date: 2021-06-28 16:43:26
 * @Description: 接口请求工具封装
 */

// 参数设置
const qsRequestData = function (obj) {
    let type = obj.site ? obj.site : 'phpSite';
    let userInfo = wx.getStorageSync('userInfo');
    let token = wx.getStorageSync('token');
    let url = obj.url.includes('http')?obj.url:wx.$PUBLIC[type] + obj.url;
	
    // 返回请求配置文件
    return {
        ignoreErrorMsg: obj.ignoreErrorMsg,
        url: url,
        method: obj.method ? obj.method : 'POST',
        data: obj.data,
        header: {
            'content-type': 'application/x-www-form-urlencoded',
            "x-auth-key": token || ''
        },
        timeout: 30000,
        //超时设置
        load: obj.load == true ? true : false,
        //加载设置，默认false
        loadText: obj.loadText ? obj.loadText : '加载中...' //加载提示
    };
};
// 请求拦截 200 300 404 500 502
const intercept = function (res, config) {
    let stateInfo = {
        flag: false,
        errMessage: ''
    };
    //  请求状态码
    switch (res.statusCode) {
        case 200:
            stateInfo.flag = errException(res, config).flag;
            stateInfo.errMessage = errException(res, config).errMessage;
            break;
        case 300 <= res.statusCode < 400:
            stateInfo.errMessage = `重定向`;
            break;
        case 400:
            stateInfo.errMessage = '请求错误(400)';
            break;
        case 401:
            stateInfo.errMessage = '未授权(401)';
            break;
        case 403:
            stateInfo.errMessage = '拒绝访问(403)';
            break;
        case 404:
            stateInfo.errMessage = '请求出错(404)';
            break;
        case 502:
            stateInfo.errMessage = `服务端错误`;
            break;
        default:
            stateInfo.errMessage = `接口请求失败`;
            console.log('请求失败的原因',res)
    }
    return stateInfo;
};

// 数据异常处理(接口请求成功，但是数据未正常返回)
// busy AUTH等
const errException = function (res, config) {
    let code = Number(res.data.code);
    let stateInfo = {
        flag: false,
        errMessage: ''
    };
    if (code || code == 0) {
        switch (code) {
            // 用户未登录
            case -1:
                stateInfo.errMessage = '用户未登录！';
                break;
            // 参数错误
            case -2:
                stateInfo.errMessage = res.data.message || res.data.msg;
                break;
            // 请求失败
            case 0:
                stateInfo.flag = false;
                stateInfo.errMessage = res.data.message || res.data.msg;
                break;
            // 请求成功
            case 1:
                stateInfo.flag = true;
                break;
            // 尚未注册
            case 404:
                stateInfo.flag = true;
                break;
            // 业务错误
            case 2:
                stateInfo.errMessage = res.data.message || res.data.msg;
                break;
            // 默认
            default:
                stateInfo.errMessage = '请求失败';
                break;
        }
    } else {
        stateInfo.errMessage = '接口请求成功，但未返回数据--返回体为XML文件';
    }
    return stateInfo;
};

// 发送请求
/* 使用方法:
 * 1.页面引入该模块
 * 2.在调用接口
 * wx.$http(obj).then(res=>{
 *  // 请求成功的处理
 * }).catch(err=>{
 *   // 请求失败的处理
 * })
 */
wx.$http = function (obj) {
    let config = qsRequestData(obj);
    if (config.load) {
        wx.showLoading({
            title: config.loadText,
            mask: true
        });
    }
    return new Promise((resolve, reject) => {
        return wx.request({
            ...config,
            complete(res) {
                if (config.load) {
                    wx.hideLoading();
                }
                if(res.statusCode == 401 || res.data.code == -1){
                    wx.removeStorageSync('userInfo');
                    wx.redirectTo({
                        url: '/pages/login/index',
                    })
                }
                if (!obj.ignoreErrorMsg && intercept(res, config).flag == false) {
                    wx.showToast({
                        title: intercept(res, config).errMessage || '操作失败',
                        icon: 'none'
                    });
                }
            },
            success(res) {
                // 状态码200 且__code状态为OK
                if (intercept(res, config).flag) {
                    resolve(res.data);
                }
                // 状态码200，但状态码不等于OK
                else {
                    // 正式环境会开放catch方法，便于处理后续逻辑
                    reject(intercept(res, config).errMessage);
                }
            },
            // 请求出错，状态码不等于200，并将对应状态码的错误信息返回
            fail(res) {
                // 正式环境会开放catch方法，便于处理后续逻辑
                reject(intercept(res, config).errMessage);
            }
        });
    });
};

module.exports = wx.$http;
